Part 1 Introduction
We became interested in the differences between schools in the history of philosophy. From a dataset that contains over 300,000 sentences from over 50 texts spanning 10 major schools of philosophy I want to talk a data story about the direct differences and relationships between these schools. The represented schools are: Plato, Aristotle, Rationalism, Empiricism, German Idealism, Communism, Capitalism, Phenomenology, Continental Philosophy, and Analytic Philosophy. What we are looking at is the date of publication, the length, and the frequency of the words. Now we first load some packages and read the dataset.
library(tidyverse)
library(tm)
library(tidytext)
library(wordcloud2)
library(ggplot2)
data=read_csv("../data/philosophy_data.csv")
Part 2 Length of Sentence
hist(data$sentence_length,breaks = 200,xlab = "Length",main = "Histogram of length")
After importing the data, we first look at the letter length of each sentence. When we plot the histogram, we can see that the longest sentence is made up of more than 2,000 letters, but most sentences are not that long, basically less than 600 letters.
hist(data$sentence_length[which(data$sentence_length<600)],breaks = 200,xlab = "Length",main = "Histogram of length (<600)")

sum(data$sentence_length>600)/nrow(data)
[1] 0.004063103
median(data$sentence_length)
[1] 127
For convenience, let’s redraw the histogram of the sentences with less than 600 letters. By calculation, only 0.4% of the sentences were longer than 600 letters. The median number of letters is 127. The histogram shows that the frequency increases as the length increases, and then decreases gradually after reaching the peak. And it also shows a distribution skewed to the right.
(g1= ggplot(data,aes(school,sentence_length,fill=school))+
geom_violin())

Next we draw some violin plots of each school and see what their characteristics are. Except for nietzsche and plato, the plots of other schools are like water droplets. The plots of nietzsche and plato look like triangles, which means many of these sentences are short sentences.
Part 3 Frequency of Words
rus_stopwords = data.frame(word = stopwords("en"))
rus_stopwords=rbind(rus_stopwords,"one","will","can","must","things","also","may","thing","just","us","yet","else","man")
First we set same Particularly common words, like pronouns or conjunctions. We will not count these words when we do word frequency statistics.
All
all_tokens=data%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
all_frequency = all_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(all_frequency)

After counting the frequency of words, we draw the wordcloud for all philosophy sentences.
Plato
plato_tokens=data%>%filter(school=="plato")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
plato_frequency = plato_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(plato_frequency)

From the wordcloud of Plato school, we can see that “say”, “said” and “think” are come up a lot. we can get that many of these sentences are quotations from some people. As we suspected, Platonism was originally expressed in the dialogues of Plato.
Aristotle
aristotle_tokens=data%>%filter(school=="aristotle")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
aristotle_frequency = aristotle_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(aristotle_frequency)

It is interesting that the word “animals” often appears in Aristotle’s sentences. Although Aristotle was a student of Plato, he abandoned the idealistic view held by his teacher. Plato believed that idea is the prototype of material object, which exists independently without relying on material object. Most of the sentences with “animals” described the habits of the animals he had observed, which also reflected his pursuit of science.
Empiricism
empiricism_tokens=data%>%filter(school=="empiricism")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
empiricism_frequency = empiricism_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(empiricism_frequency)

From the wordcloud of Empiricism,“idea”, “ideas”, and “mind” are the most common words in these sentences. Empiricism holds that perceptual experience is the only source of knowledge, and all knowledge is obtained and verified through experience. This also shows that empiricism has a great deal of discussion on human thought.
Rationalism
rationalism_tokens=data%>%filter(school=="rationalism")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
rationalism_frequency = rationalism_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(rationalism_frequency)

Rationalism is opposed to empiricism, and it believe that criterion of the truth is not sensory but intellectual and deductive. And it is easy to understand discussions of God and ideas fill these sentences.
Analytic
analytic_tokens=data%>%filter(school=="analytic")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
analytic_frequency = analytic_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(analytic_frequency)

Analytic philosophy tends to use logic. The words like “true”, “theory” and “fact” are used frequently.
Continental
continental_tokens=data%>%filter(school=="continental")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
continental_frequency = continental_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(continental_frequency)

From the wordcloud, we can see that “madness” and “language” appear most frequently.
Phenomenology
phenomenology_tokens=data%>%filter(school=="phenomenology")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
phenomenology_frequency = phenomenology_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(phenomenology_frequency)

The “world” is the most important word in Phenomenology.
German Idealism
german_idealism_tokens=data%>%filter(school=="german_idealism")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
german_idealism_frequency = german_idealism_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(german_idealism_frequency)

Idealism tends to discuss the relationship between human consciousness and the nature. Therefore, words like “concept”, “nature” and “pure” are used frequently.
Communism
communism_tokens=data%>%filter(school=="communism")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
communism_frequency = communism_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(communism_frequency)

Communism hopes to liberate the labor force and give them more value created by themselves. Therefore, “labour” would be the hot word absolutely. Of course, there are many words about labour in sentences, such as “working”, “value” and “production”.
Capitalism
capitalism_tokens=data%>%filter(school=="capitalism")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
capitalism_frequency = capitalism_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(capitalism_frequency)

Capitalism and communism are two opposing concepts. But they do discuss two sides of the one thing, so some words are often mentioned by both sides, such as “labour”, but capitalism prefers to replace “value” with “money” and “price”.
Stoicism
stoicism_tokens=data%>%filter(school=="stoicism")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
stoicism_frequency = stoicism_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(stoicism_frequency)

Nietzsche
nietzsche_tokens=data%>%filter(school=="nietzsche")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
nietzsche_frequency = nietzsche_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(nietzsche_frequency)

The main difference between stoicism and Nietzsche and other schools is that they use a lot of Old English, such as “thou”,“ye”, “thee”, and “thy”.
Feminism
feminism_tokens=data%>%filter(school=="feminism")%>%select(sentence_str)%>%
unnest_tokens(word, sentence_str)%>% anti_join(rus_stopwords)
Joining, by = "word"
feminism_frequency = feminism_tokens %>% count(word) %>% arrange(desc(n))
### wordcloud2(feminism_frequency)

As the name suggests, feminism must mention “women”, “woman” most.
feminism_frequency%>%filter(word=="women"|word=="woman")%>%select(word,feminism=n)%>%mutate(
all_frequency%>%filter(word=="women"|word=="woman")%>%select(all=n))
count(data,school=="feminism")
NA
Let’s look at the number of women in other schools. Hundreds of years ago, there was serious gender discrimination, and women had not been paid attention to. Therefore, the word “man” is unconsciously regarded as a personal pronoun, while the words “woman” and “women” are rarely mentioned. From the output we can see that feminism’s sentences account for 5% of all sentences, but the number of references to women does account for nearly 80%. So we need to pay more attention to gender equality.
LS0tDQp0aXRsZTogIlByb2plY3QgMSBSIE5vdGVib29rIERhdGEgU3RvcnkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIFBhcnQgMSBJbnRyb2R1Y3Rpb24NCg0KV2UgYmVjYW1lIGludGVyZXN0ZWQgaW4gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gc2Nob29scyBpbiB0aGUgaGlzdG9yeSBvZiBwaGlsb3NvcGh5LiBGcm9tIGEgZGF0YXNldCB0aGF0IGNvbnRhaW5zIG92ZXIgMzAwLDAwMCBzZW50ZW5jZXMgZnJvbSBvdmVyIDUwIHRleHRzIHNwYW5uaW5nIDEwIG1ham9yIHNjaG9vbHMgb2YgcGhpbG9zb3BoeSBJIHdhbnQgdG8gdGFsayBhIGRhdGEgc3RvcnkgYWJvdXQgdGhlIGRpcmVjdCBkaWZmZXJlbmNlcyBhbmQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZXNlIHNjaG9vbHMuIFRoZSByZXByZXNlbnRlZCBzY2hvb2xzIGFyZTogUGxhdG8sIEFyaXN0b3RsZSwgUmF0aW9uYWxpc20sIEVtcGlyaWNpc20sIEdlcm1hbiBJZGVhbGlzbSwgQ29tbXVuaXNtLCBDYXBpdGFsaXNtLCBQaGVub21lbm9sb2d5LCBDb250aW5lbnRhbCBQaGlsb3NvcGh5LCBhbmQgQW5hbHl0aWMgUGhpbG9zb3BoeS4gV2hhdCB3ZSBhcmUgbG9va2luZyBhdCBpcyB0aGUgZGF0ZSBvZiBwdWJsaWNhdGlvbiwgdGhlIGxlbmd0aCwgYW5kIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHdvcmRzLiBOb3cgd2UgZmlyc3QgbG9hZCBzb21lIHBhY2thZ2VzIGFuZCByZWFkIHRoZSBkYXRhc2V0Lg0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0bSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KHdvcmRjbG91ZDIpDQpsaWJyYXJ5KGdncGxvdDIpDQpkYXRhPXJlYWRfY3N2KCIuLi9kYXRhL3BoaWxvc29waHlfZGF0YS5jc3YiKQ0KYGBgDQoNCiMgUGFydCAyIExlbmd0aCBvZiBTZW50ZW5jZQ0KDQpgYGB7cn0NCmhpc3QoZGF0YSRzZW50ZW5jZV9sZW5ndGgsYnJlYWtzID0gMjAwLHhsYWIgPSAiTGVuZ3RoIixtYWluID0gIkhpc3RvZ3JhbSBvZiBsZW5ndGgiKQ0KYGBgDQoNCkFmdGVyIGltcG9ydGluZyB0aGUgZGF0YSwgd2UgZmlyc3QgbG9vayBhdCB0aGUgbGV0dGVyIGxlbmd0aCBvZiBlYWNoIHNlbnRlbmNlLiBXaGVuIHdlIHBsb3QgdGhlIGhpc3RvZ3JhbSwgd2UgY2FuIHNlZSB0aGF0IHRoZSBsb25nZXN0IHNlbnRlbmNlIGlzIG1hZGUgdXAgb2YgbW9yZSB0aGFuIDIsMDAwIGxldHRlcnMsIGJ1dCBtb3N0IHNlbnRlbmNlcyBhcmUgbm90IHRoYXQgbG9uZywgYmFzaWNhbGx5IGxlc3MgdGhhbiA2MDAgbGV0dGVycy4NCg0KYGBge3J9DQpoaXN0KGRhdGEkc2VudGVuY2VfbGVuZ3RoW3doaWNoKGRhdGEkc2VudGVuY2VfbGVuZ3RoPDYwMCldLGJyZWFrcyA9IDIwMCx4bGFiID0gIkxlbmd0aCIsbWFpbiA9ICJIaXN0b2dyYW0gb2YgbGVuZ3RoICg8NjAwKSIpDQpzdW0oZGF0YSRzZW50ZW5jZV9sZW5ndGg+NjAwKS9ucm93KGRhdGEpDQptZWRpYW4oZGF0YSRzZW50ZW5jZV9sZW5ndGgpDQpgYGANCg0KRm9yIGNvbnZlbmllbmNlLCBsZXQncyByZWRyYXcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgc2VudGVuY2VzIHdpdGggbGVzcyB0aGFuIDYwMCBsZXR0ZXJzLiBCeSBjYWxjdWxhdGlvbiwgb25seSAwLjQlIG9mIHRoZSBzZW50ZW5jZXMgd2VyZSBsb25nZXIgdGhhbiA2MDAgbGV0dGVycy4gVGhlIG1lZGlhbiBudW1iZXIgb2YgbGV0dGVycyBpcyAxMjcuIFRoZSBoaXN0b2dyYW0gc2hvd3MgdGhhdCB0aGUgZnJlcXVlbmN5IGluY3JlYXNlcyBhcyB0aGUgbGVuZ3RoIGluY3JlYXNlcywgYW5kIHRoZW4gZGVjcmVhc2VzIGdyYWR1YWxseSBhZnRlciByZWFjaGluZyB0aGUgcGVhay4gQW5kIGl0IGFsc28gc2hvd3MgYSBkaXN0cmlidXRpb24gc2tld2VkIHRvIHRoZSByaWdodC4NCg0KDQpgYGB7cn0NCihnMT0gZ2dwbG90KGRhdGEsYWVzKHNjaG9vbCxzZW50ZW5jZV9sZW5ndGgsZmlsbD1zY2hvb2wpKSsNCiAgZ2VvbV92aW9saW4oKSkNCmBgYA0KDQpOZXh0IHdlIGRyYXcgc29tZSB2aW9saW4gcGxvdHMgb2YgZWFjaCBzY2hvb2wgYW5kIHNlZSB3aGF0IHRoZWlyIGNoYXJhY3RlcmlzdGljcyBhcmUuIEV4Y2VwdCBmb3IgbmlldHpzY2hlIGFuZCBwbGF0bywgdGhlIHBsb3RzIG9mIG90aGVyIHNjaG9vbHMgYXJlIGxpa2Ugd2F0ZXIgZHJvcGxldHMuIFRoZSBwbG90cyBvZiBuaWV0enNjaGUgYW5kIHBsYXRvIGxvb2sgbGlrZSB0cmlhbmdsZXMsIHdoaWNoIG1lYW5zIG1hbnkgb2YgdGhlc2Ugc2VudGVuY2VzIGFyZSBzaG9ydCBzZW50ZW5jZXMuDQoNCiMgUGFydCAzIEZyZXF1ZW5jeSBvZiBXb3Jkcw0KDQpgYGB7cn0NCnJ1c19zdG9wd29yZHMgPSBkYXRhLmZyYW1lKHdvcmQgPSBzdG9wd29yZHMoImVuIikpDQpydXNfc3RvcHdvcmRzPXJiaW5kKHJ1c19zdG9wd29yZHMsIm9uZSIsIndpbGwiLCJjYW4iLCJtdXN0IiwidGhpbmdzIiwiYWxzbyIsIm1heSIsInRoaW5nIiwianVzdCIsInVzIiwieWV0IiwiZWxzZSIsIm1hbiIpDQpgYGANCg0KRmlyc3Qgd2Ugc2V0IHNhbWUgUGFydGljdWxhcmx5IGNvbW1vbiB3b3JkcywgbGlrZSBwcm9ub3VucyBvciBjb25qdW5jdGlvbnMuIFdlIHdpbGwgbm90IGNvdW50IHRoZXNlIHdvcmRzIHdoZW4gd2UgZG8gd29yZCBmcmVxdWVuY3kgc3RhdGlzdGljcy4NCg0KIyMgQWxsDQpgYGB7cn0NCmFsbF90b2tlbnM9ZGF0YSU+JXNlbGVjdChzZW50ZW5jZV9zdHIpJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc2VudGVuY2Vfc3RyKSU+JSBhbnRpX2pvaW4ocnVzX3N0b3B3b3JkcykNCmFsbF9mcmVxdWVuY3kgPSBhbGxfdG9rZW5zICU+JSBjb3VudCh3b3JkKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KIyMjIHdvcmRjbG91ZDIoYWxsX2ZyZXF1ZW5jeSkNCmBgYA0KDQohW10oLi4vZmlncy9hbGwucG5nKQ0KDQpBZnRlciBjb3VudGluZyB0aGUgZnJlcXVlbmN5IG9mIHdvcmRzLCB3ZSBkcmF3IHRoZSB3b3JkY2xvdWQgZm9yIGFsbCBwaGlsb3NvcGh5IHNlbnRlbmNlcy4NCg0KIyMgUGxhdG8NCmBgYHtyfQ0KcGxhdG9fdG9rZW5zPWRhdGElPiVmaWx0ZXIoc2Nob29sPT0icGxhdG8iKSU+JXNlbGVjdChzZW50ZW5jZV9zdHIpJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc2VudGVuY2Vfc3RyKSU+JSBhbnRpX2pvaW4ocnVzX3N0b3B3b3JkcykNCnBsYXRvX2ZyZXF1ZW5jeSA9IHBsYXRvX3Rva2VucyAlPiUgY291bnQod29yZCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCiMjIyB3b3JkY2xvdWQyKHBsYXRvX2ZyZXF1ZW5jeSkNCmBgYCAgIA0KDQohW10oLi4vZmlncy9wbGF0by5wbmcpDQoNCkZyb20gdGhlIHdvcmRjbG91ZCBvZiBQbGF0byBzY2hvb2wsIHdlIGNhbiBzZWUgdGhhdCAic2F5IiwgInNhaWQiIGFuZCAidGhpbmsiIGFyZSBjb21lIHVwIGEgbG90LiB3ZSBjYW4gZ2V0IHRoYXQgbWFueSBvZiB0aGVzZSBzZW50ZW5jZXMgYXJlIHF1b3RhdGlvbnMgZnJvbSBzb21lIHBlb3BsZS4gQXMgd2Ugc3VzcGVjdGVkLCBQbGF0b25pc20gd2FzIG9yaWdpbmFsbHkgZXhwcmVzc2VkIGluIHRoZSBkaWFsb2d1ZXMgb2YgUGxhdG8uDQoNCiMjIEFyaXN0b3RsZQ0KDQpgYGB7cn0NCmFyaXN0b3RsZV90b2tlbnM9ZGF0YSU+JWZpbHRlcihzY2hvb2w9PSJhcmlzdG90bGUiKSU+JXNlbGVjdChzZW50ZW5jZV9zdHIpJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc2VudGVuY2Vfc3RyKSU+JSBhbnRpX2pvaW4ocnVzX3N0b3B3b3JkcykNCmFyaXN0b3RsZV9mcmVxdWVuY3kgPSBhcmlzdG90bGVfdG9rZW5zICU+JSBjb3VudCh3b3JkKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KIyMjIHdvcmRjbG91ZDIoYXJpc3RvdGxlX2ZyZXF1ZW5jeSkNCmBgYA0KDQohW10oLi4vZmlncy9hcmlzdG90bGUucG5nKQ0KDQpJdCBpcyBpbnRlcmVzdGluZyB0aGF0IHRoZSB3b3JkICJhbmltYWxzIiBvZnRlbiBhcHBlYXJzIGluIEFyaXN0b3RsZSdzIHNlbnRlbmNlcy4gQWx0aG91Z2ggQXJpc3RvdGxlIHdhcyBhIHN0dWRlbnQgb2YgUGxhdG8sIGhlIGFiYW5kb25lZCB0aGUgaWRlYWxpc3RpYyB2aWV3IGhlbGQgYnkgaGlzIHRlYWNoZXIuIFBsYXRvIGJlbGlldmVkIHRoYXQgaWRlYSBpcyB0aGUgcHJvdG90eXBlIG9mIG1hdGVyaWFsIG9iamVjdCwgd2hpY2ggZXhpc3RzIGluZGVwZW5kZW50bHkgd2l0aG91dCByZWx5aW5nIG9uIG1hdGVyaWFsIG9iamVjdC4gTW9zdCBvZiB0aGUgc2VudGVuY2VzIHdpdGggImFuaW1hbHMiIGRlc2NyaWJlZCB0aGUgaGFiaXRzIG9mIHRoZSBhbmltYWxzIGhlIGhhZCBvYnNlcnZlZCwgd2hpY2ggYWxzbyByZWZsZWN0ZWQgaGlzIHB1cnN1aXQgb2Ygc2NpZW5jZS4NCg0KIyMgRW1waXJpY2lzbQ0KDQpgYGB7cn0NCmVtcGlyaWNpc21fdG9rZW5zPWRhdGElPiVmaWx0ZXIoc2Nob29sPT0iZW1waXJpY2lzbSIpJT4lc2VsZWN0KHNlbnRlbmNlX3N0ciklPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzZW50ZW5jZV9zdHIpJT4lIGFudGlfam9pbihydXNfc3RvcHdvcmRzKQ0KZW1waXJpY2lzbV9mcmVxdWVuY3kgPSBlbXBpcmljaXNtX3Rva2VucyAlPiUgY291bnQod29yZCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCiMjIyB3b3JkY2xvdWQyKGVtcGlyaWNpc21fZnJlcXVlbmN5KQ0KYGBgDQoNCiFbXSguLi9maWdzL2VtcGlyaWNpc20ucG5nKQ0KDQpGcm9tIHRoZSB3b3JkY2xvdWQgb2YgRW1waXJpY2lzbSwiaWRlYSIsICJpZGVhcyIsIGFuZCAibWluZCIgYXJlIHRoZSBtb3N0IGNvbW1vbiB3b3JkcyBpbiB0aGVzZSBzZW50ZW5jZXMuIEVtcGlyaWNpc20gaG9sZHMgdGhhdCBwZXJjZXB0dWFsIGV4cGVyaWVuY2UgaXMgdGhlIG9ubHkgc291cmNlIG9mIGtub3dsZWRnZSwgYW5kIGFsbCBrbm93bGVkZ2UgaXMgb2J0YWluZWQgYW5kIHZlcmlmaWVkIHRocm91Z2ggZXhwZXJpZW5jZS4gVGhpcyBhbHNvIHNob3dzIHRoYXQgZW1waXJpY2lzbSBoYXMgYSBncmVhdCBkZWFsIG9mIGRpc2N1c3Npb24gb24gaHVtYW4gdGhvdWdodC4NCg0KIyMgUmF0aW9uYWxpc20NCg0KYGBge3J9DQpyYXRpb25hbGlzbV90b2tlbnM9ZGF0YSU+JWZpbHRlcihzY2hvb2w9PSJyYXRpb25hbGlzbSIpJT4lc2VsZWN0KHNlbnRlbmNlX3N0ciklPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzZW50ZW5jZV9zdHIpJT4lIGFudGlfam9pbihydXNfc3RvcHdvcmRzKQ0KcmF0aW9uYWxpc21fZnJlcXVlbmN5ID0gcmF0aW9uYWxpc21fdG9rZW5zICU+JSBjb3VudCh3b3JkKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KIyMjIHdvcmRjbG91ZDIocmF0aW9uYWxpc21fZnJlcXVlbmN5KQ0KYGBgDQoNCiFbXSguLi9maWdzL3JhdGlvbmFsaXNtLnBuZykNCg0KUmF0aW9uYWxpc20gaXMgb3Bwb3NlZCB0byBlbXBpcmljaXNtLCBhbmQgaXQgYmVsaWV2ZSB0aGF0IGNyaXRlcmlvbiBvZiB0aGUgdHJ1dGggaXMgbm90IHNlbnNvcnkgYnV0IGludGVsbGVjdHVhbCBhbmQgZGVkdWN0aXZlLiBBbmQgaXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kIGRpc2N1c3Npb25zIG9mIEdvZCBhbmQgaWRlYXMgZmlsbCB0aGVzZSBzZW50ZW5jZXMuDQoNCiMjIEFuYWx5dGljDQoNCmBgYHtyfQ0KYW5hbHl0aWNfdG9rZW5zPWRhdGElPiVmaWx0ZXIoc2Nob29sPT0iYW5hbHl0aWMiKSU+JXNlbGVjdChzZW50ZW5jZV9zdHIpJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc2VudGVuY2Vfc3RyKSU+JSBhbnRpX2pvaW4ocnVzX3N0b3B3b3JkcykNCmFuYWx5dGljX2ZyZXF1ZW5jeSA9IGFuYWx5dGljX3Rva2VucyAlPiUgY291bnQod29yZCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCiMjIyB3b3JkY2xvdWQyKGFuYWx5dGljX2ZyZXF1ZW5jeSkNCmBgYA0KDQohW10oLi4vZmlncy9hbmFseXRpYy5wbmcpDQoNCkFuYWx5dGljIHBoaWxvc29waHkgdGVuZHMgdG8gdXNlIGxvZ2ljLiBUaGUgd29yZHMgbGlrZSAidHJ1ZSIsICJ0aGVvcnkiIGFuZCAiZmFjdCIgYXJlIHVzZWQgZnJlcXVlbnRseS4NCg0KDQojIyBDb250aW5lbnRhbA0KDQpgYGB7cn0NCmNvbnRpbmVudGFsX3Rva2Vucz1kYXRhJT4lZmlsdGVyKHNjaG9vbD09ImNvbnRpbmVudGFsIiklPiVzZWxlY3Qoc2VudGVuY2Vfc3RyKSU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlX3N0ciklPiUgYW50aV9qb2luKHJ1c19zdG9wd29yZHMpDQpjb250aW5lbnRhbF9mcmVxdWVuY3kgPSBjb250aW5lbnRhbF90b2tlbnMgJT4lIGNvdW50KHdvcmQpICU+JSBhcnJhbmdlKGRlc2MobikpDQojIyMgd29yZGNsb3VkMihjb250aW5lbnRhbF9mcmVxdWVuY3kpDQpgYGANCg0KIVtdKC4uL2ZpZ3MvY29udGluZW50YWwucG5nKQ0KDQpGcm9tIHRoZSB3b3JkY2xvdWQsIHdlIGNhbiBzZWUgdGhhdCAibWFkbmVzcyIgYW5kICJsYW5ndWFnZSIgYXBwZWFyIG1vc3QgZnJlcXVlbnRseS4gDQoNCiMjIFBoZW5vbWVub2xvZ3kgDQpgYGB7cn0NCnBoZW5vbWVub2xvZ3lfdG9rZW5zPWRhdGElPiVmaWx0ZXIoc2Nob29sPT0icGhlbm9tZW5vbG9neSIpJT4lc2VsZWN0KHNlbnRlbmNlX3N0ciklPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzZW50ZW5jZV9zdHIpJT4lIGFudGlfam9pbihydXNfc3RvcHdvcmRzKQ0KcGhlbm9tZW5vbG9neV9mcmVxdWVuY3kgPSBwaGVub21lbm9sb2d5X3Rva2VucyAlPiUgY291bnQod29yZCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCiMjIyB3b3JkY2xvdWQyKHBoZW5vbWVub2xvZ3lfZnJlcXVlbmN5KQ0KYGBgDQoNCiFbXSguLi9maWdzL3BoZW5vbWVub2xvZ3kucG5nKQ0KDQpUaGUgIndvcmxkIiBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgd29yZCBpbiBQaGVub21lbm9sb2d5Lg0KDQojIyBHZXJtYW4gSWRlYWxpc20NCmBgYHtyfQ0KZ2VybWFuX2lkZWFsaXNtX3Rva2Vucz1kYXRhJT4lZmlsdGVyKHNjaG9vbD09Imdlcm1hbl9pZGVhbGlzbSIpJT4lc2VsZWN0KHNlbnRlbmNlX3N0ciklPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzZW50ZW5jZV9zdHIpJT4lIGFudGlfam9pbihydXNfc3RvcHdvcmRzKQ0KZ2VybWFuX2lkZWFsaXNtX2ZyZXF1ZW5jeSA9IGdlcm1hbl9pZGVhbGlzbV90b2tlbnMgJT4lIGNvdW50KHdvcmQpICU+JSBhcnJhbmdlKGRlc2MobikpDQojIyMgd29yZGNsb3VkMihnZXJtYW5faWRlYWxpc21fZnJlcXVlbmN5KQ0KYGBgDQoNCiFbXSguLi9maWdzL2dlcm1hbl9pZGVhbGlzbS5wbmcpDQoNCklkZWFsaXNtIHRlbmRzIHRvIGRpc2N1c3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGh1bWFuIGNvbnNjaW91c25lc3MgYW5kIHRoZSBuYXR1cmUuIFRoZXJlZm9yZSwgd29yZHMgbGlrZSAiY29uY2VwdCIsICJuYXR1cmUiIGFuZCAicHVyZSIgYXJlIHVzZWQgZnJlcXVlbnRseS4NCg0KIyMgQ29tbXVuaXNtDQpgYGB7cn0NCmNvbW11bmlzbV90b2tlbnM9ZGF0YSU+JWZpbHRlcihzY2hvb2w9PSJjb21tdW5pc20iKSU+JXNlbGVjdChzZW50ZW5jZV9zdHIpJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc2VudGVuY2Vfc3RyKSU+JSBhbnRpX2pvaW4ocnVzX3N0b3B3b3JkcykNCmNvbW11bmlzbV9mcmVxdWVuY3kgPSBjb21tdW5pc21fdG9rZW5zICU+JSBjb3VudCh3b3JkKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KIyMjIHdvcmRjbG91ZDIoY29tbXVuaXNtX2ZyZXF1ZW5jeSkNCmBgYA0KDQohW10oLi4vZmlncy9jb21tdW5pc20ucG5nKQ0KDQpDb21tdW5pc20gaG9wZXMgdG8gbGliZXJhdGUgdGhlIGxhYm9yIGZvcmNlIGFuZCBnaXZlIHRoZW0gbW9yZSB2YWx1ZSBjcmVhdGVkIGJ5IHRoZW1zZWx2ZXMuIFRoZXJlZm9yZSwgImxhYm91ciIgd291bGQgYmUgdGhlIGhvdCB3b3JkIGFic29sdXRlbHkuIE9mIGNvdXJzZSwgdGhlcmUgYXJlIG1hbnkgd29yZHMgYWJvdXQgbGFib3VyIGluIHNlbnRlbmNlcywgc3VjaCBhcyAid29ya2luZyIsICJ2YWx1ZSIgYW5kICJwcm9kdWN0aW9uIi4NCg0KICAgDQoNCiMjIENhcGl0YWxpc20NCmBgYHtyfQ0KY2FwaXRhbGlzbV90b2tlbnM9ZGF0YSU+JWZpbHRlcihzY2hvb2w9PSJjYXBpdGFsaXNtIiklPiVzZWxlY3Qoc2VudGVuY2Vfc3RyKSU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlX3N0ciklPiUgYW50aV9qb2luKHJ1c19zdG9wd29yZHMpDQpjYXBpdGFsaXNtX2ZyZXF1ZW5jeSA9IGNhcGl0YWxpc21fdG9rZW5zICU+JSBjb3VudCh3b3JkKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KIyMjIHdvcmRjbG91ZDIoY2FwaXRhbGlzbV9mcmVxdWVuY3kpDQpgYGANCg0KIVtdKC4uL2ZpZ3MvY2FwaXRhbGlzbS5wbmcpDQoNCkNhcGl0YWxpc20gYW5kIGNvbW11bmlzbSBhcmUgdHdvIG9wcG9zaW5nIGNvbmNlcHRzLiBCdXQgdGhleSBkbyBkaXNjdXNzIHR3byBzaWRlcyBvZiB0aGUgb25lIHRoaW5nLCBzbyBzb21lIHdvcmRzIGFyZSBvZnRlbiBtZW50aW9uZWQgYnkgYm90aCBzaWRlcywgc3VjaCBhcyAibGFib3VyIiwgYnV0IGNhcGl0YWxpc20gcHJlZmVycyB0byByZXBsYWNlICJ2YWx1ZSIgd2l0aCAibW9uZXkiIGFuZCAicHJpY2UiLg0KDQoNCiMjIFN0b2ljaXNtDQpgYGB7cn0NCnN0b2ljaXNtX3Rva2Vucz1kYXRhJT4lZmlsdGVyKHNjaG9vbD09InN0b2ljaXNtIiklPiVzZWxlY3Qoc2VudGVuY2Vfc3RyKSU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlX3N0ciklPiUgYW50aV9qb2luKHJ1c19zdG9wd29yZHMpDQpzdG9pY2lzbV9mcmVxdWVuY3kgPSBzdG9pY2lzbV90b2tlbnMgJT4lIGNvdW50KHdvcmQpICU+JSBhcnJhbmdlKGRlc2MobikpDQojIyMgd29yZGNsb3VkMihzdG9pY2lzbV9mcmVxdWVuY3kpDQpgYGANCg0KIVtdKC4uL2ZpZ3Mvc3RvaWNpc20ucG5nKQ0KDQoNCg0KIyMgTmlldHpzY2hlDQpgYGB7cn0NCm5pZXR6c2NoZV90b2tlbnM9ZGF0YSU+JWZpbHRlcihzY2hvb2w9PSJuaWV0enNjaGUiKSU+JXNlbGVjdChzZW50ZW5jZV9zdHIpJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc2VudGVuY2Vfc3RyKSU+JSBhbnRpX2pvaW4ocnVzX3N0b3B3b3JkcykNCm5pZXR6c2NoZV9mcmVxdWVuY3kgPSBuaWV0enNjaGVfdG9rZW5zICU+JSBjb3VudCh3b3JkKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KIyMjIHdvcmRjbG91ZDIobmlldHpzY2hlX2ZyZXF1ZW5jeSkNCmBgYA0KDQohW10oLi4vZmlncy9uaWV0enNjaGUucG5nKQ0KIA0KVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHN0b2ljaXNtIGFuZCBOaWV0enNjaGUgYW5kIG90aGVyIHNjaG9vbHMgaXMgdGhhdCB0aGV5IHVzZSBhIGxvdCBvZiBPbGQgRW5nbGlzaCwgc3VjaCBhcyAidGhvdSIsInllIiwgInRoZWUiLCBhbmQgInRoeSIuDQogDQojIyBGZW1pbmlzbQ0KYGBge3J9DQpmZW1pbmlzbV90b2tlbnM9ZGF0YSU+JWZpbHRlcihzY2hvb2w9PSJmZW1pbmlzbSIpJT4lc2VsZWN0KHNlbnRlbmNlX3N0ciklPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzZW50ZW5jZV9zdHIpJT4lIGFudGlfam9pbihydXNfc3RvcHdvcmRzKQ0KZmVtaW5pc21fZnJlcXVlbmN5ID0gZmVtaW5pc21fdG9rZW5zICU+JSBjb3VudCh3b3JkKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KIyMjIHdvcmRjbG91ZDIoZmVtaW5pc21fZnJlcXVlbmN5KQ0KYGBgDQoNCiFbXSguLi9maWdzL2ZlbWluaXNtLnBuZykNCg0KQXMgdGhlIG5hbWUgc3VnZ2VzdHMsIGZlbWluaXNtIG11c3QgbWVudGlvbiAid29tZW4iLCAid29tYW4iIG1vc3QuIA0KDQpgYGB7cn0NCmZlbWluaXNtX2ZyZXF1ZW5jeSU+JWZpbHRlcih3b3JkPT0id29tZW4ifHdvcmQ9PSJ3b21hbiIpJT4lc2VsZWN0KHdvcmQsZmVtaW5pc209biklPiVtdXRhdGUoDQphbGxfZnJlcXVlbmN5JT4lZmlsdGVyKHdvcmQ9PSJ3b21lbiJ8d29yZD09IndvbWFuIiklPiVzZWxlY3QoYWxsPW4pKQ0KY291bnQoZGF0YSxzY2hvb2w9PSJmZW1pbmlzbSIpDQoNCmBgYA0KDQpMZXQncyBsb29rIGF0IHRoZSBudW1iZXIgb2Ygd29tZW4gaW4gb3RoZXIgc2Nob29scy4gSHVuZHJlZHMgb2YgeWVhcnMgYWdvLCB0aGVyZSB3YXMgc2VyaW91cyBnZW5kZXIgZGlzY3JpbWluYXRpb24sIGFuZCB3b21lbiBoYWQgbm90IGJlZW4gcGFpZCBhdHRlbnRpb24gdG8uIFRoZXJlZm9yZSwgdGhlIHdvcmQgIm1hbiIgaXMgdW5jb25zY2lvdXNseSByZWdhcmRlZCBhcyBhIHBlcnNvbmFsIHByb25vdW4sIHdoaWxlIHRoZSB3b3JkcyAid29tYW4iIGFuZCAid29tZW4iIGFyZSByYXJlbHkgbWVudGlvbmVkLiBGcm9tIHRoZSBvdXRwdXQgd2UgY2FuIHNlZSB0aGF0IGZlbWluaXNtJ3Mgc2VudGVuY2VzIGFjY291bnQgZm9yIDUlIG9mIGFsbCBzZW50ZW5jZXMsIGJ1dCB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gd29tZW4gZG9lcyBhY2NvdW50IGZvciBuZWFybHkgODAlLiBTbyB3ZSBuZWVkIHRvIHBheSBtb3JlIGF0dGVudGlvbiB0byBnZW5kZXIgZXF1YWxpdHkuDQoNCiMgUGFydCA0IENvbmNsdXNpb24NCg0KQnkgYW5hbHl6aW5nIHRoZSBsZW5ndGggYW5kIGZyZXF1ZW5jeSBvZiB3b3Jkcywgd2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlIHNlbnRlbmNlcyBvZiBlYWNoIHNjaG9vbCBoYXZlIHRoZWlyIG93biBjaGFyYWN0ZXJpc3RpY3MuIEJ5IHVuZGVyc3RhbmRpbmcgdGhlc2UgY2hhcmFjdGVyaXN0aWNzLCB3ZSBjYW4gYWxzbyBoYXZlIGEgZGVlcGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGhpc3Rvcnkgb2YgcGhpbG9zb3BoeS4gT24gdGhlIGNvbnRyYXJ5LCB3ZSBjYW4gYWxzbyBpbmZlciBmcm9tIHRoZSBzZW50ZW5jZSB3aGljaCBzY2hvb2wgaXQgY29tZXMgZnJvbS4NCg0K